﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Windows;

namespace CPN.PJN.UI.Controls.UnitTests
{
    public static class TestsHelper
    {
        /// <summary>
        /// Récupère une liste d'attributs pour un membre donné
        /// </summary>
        /// <typeparam name="T">Type d'attribut</typeparam>
        /// <param name="member">Membre pour lequel chercher des attributs</param>
        /// <returns>Les attributs du membre spécifié</returns>
        public static IEnumerable<T> GetAttributes<T>(this MemberInfo member)
            where T : Attribute
        {
            return (member == null) ?
                Enumerable.Empty<T>() :
                member.GetCustomAttributes(typeof(T), false).Cast<T>();
        }

        /// <summary>
        /// Récupère une liste de TemplateParts pour un type donné.
        /// </summary>
        /// <param name="type">Type</param>
        /// <returns>
        /// Dictionnaire de noms de TemplateParts groupés par leur type
        /// </returns>
        public static IDictionary<string, Type> GetTemplateParts(this Type type)
        {
            return GetAttributes<TemplatePartAttribute>(type).ToDictionary(a => a.Name, a => a.Type);
        }

        /// <summary>
        /// Récupère une liste des VisualStates d'un type donné
        /// </summary>
        /// <param name="type">Type</param>
        /// <returns>
        /// Dictionnaire de noms de VisualStates groupé par nom de VisualStateGroup
        /// </returns>
        public static IDictionary<string, string> GetVisualStates(this Type type)
        {
            return GetAttributes<TemplateVisualStateAttribute>(type).ToDictionary(a => a.Name, a => a.GroupName);
        }

        /// <summary>
        /// Retourne le VisualState courant d'un VisualStateGroup donné
        /// </summary>
        /// <param name="element">Elément contenant les VisualStates</param>
        /// <param name="visualStateGroupName">Nom du VisualStateGroup à retrouver</param>
        /// <returns></returns>
        public static VisualState GetCurrentVisualState(this FrameworkElement element, string visualStateGroupName)
        {
            var visualStateGroups = VisualStateManager.GetVisualStateGroups(element);

            foreach (VisualStateGroup visualStateGroup in visualStateGroups)
            {
                if (visualStateGroup.Name == visualStateGroupName)
                {
                    return visualStateGroup.CurrentState;
                }
            }

            return null;
        }
    }
}
